import { checkAllCart, deleteCart, findCart, getNewCartGoods, insertCart, mergeCart, updateCart } from '@/api/cart'

// 购物车状态
export default {
  namespaced: true,
  state: () => {
    return {
      list: []
    }
  },
  mutations: {
    // 这里主要是赋值操作，赋值空数组就清空购物车列表，也可赋值最新购物车列表数据
    setCartList (state, payload) {
      state.list = payload
    },
    // 更新修改购物车商品对象--本地
    updateCart (state, goods) {
      const obj = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        if (goods[key] !== null) {
          obj[key] = goods[key]
        }
      }
    },
    // 删除购物车商品--本地
    deleteCart (state, skuId) {
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index, 1)
    },
    // 加入购物车--本地
    addCart (state, payload) {
      const index = state.list.findIndex(v => v.id === payload.skuId)
      // 之前存过了，那就把数量累加
      if (index === -1) state.list.unshift(payload)
      // 之前没存过，就添加到数组的最前面
      else state.list[index].count += payload.count
    }
  },
  actions: {
    // 合并本地购物车
    async mergeLocalCart (store) {
      const obj = store.getters.validList.map(v => {
        return { skuId: v.skuId, selected: v.selected, count: v.count }
      })
      await mergeCart(obj)
      // 清理本地存储
      store.commit('setCartList', [])
    },
    // 获取购物车商品信息（确保库存，价格等信息都是最新的）
    findCartList (store) {
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {
          // 1. 已登录 - 发送请求
          findCart().then(res => {
            store.commit('setCartList', res.result)
          })
        } else {
          // 查一下购物车列表中所有的商品的最新信息
          store.state.list.map(item => {
            getNewCartGoods(item.skuId).then(res => {
              // console.log(item.skuId, '最新的商品信息', res)
              store.commit('updateCart', { skuId: item.skuId, ...res.result })
            })
          })
          resolve()
        }
      })
    },
    // 修改sku规格函数
    updateCartSku (store, { oldSkuId, newSku }) {
      return new Promise((resolve) => {
        // 1. 获取旧的商品信息
        const oldGoods = store.state.list.find(item => item.skuId === oldSkuId)
        if (store.rootState.user.profile.token) {
          deleteCart([oldSkuId]).then(res => {
            return insertCart({ skuId: newSku.skuId, count: oldGoods.count })
          }).then(v => {
            // 调用获取购物车列表---刷新页面
            store.dispatch('findCartList')
            resolve()
          })
        } else {
          // 2. 删除旧的商品
          store.commit('deleteCart', oldSkuId)
          // 3. 合并一条新的商品信息
          const newGoods = { ...oldGoods, ...newSku, stock: newSku.inventory }
          // 4. 新商品信息添加到购物车列表中
          store.commit('addCart', newGoods)
          resolve()
        }
      })
    },
    // 做有效商品的全选&反选
    checkAllCart (store, selected) {
      return new Promise((resolve, reject) => {
        if (store.rootState.user.profile.token) {
          // 登录 TODO
          const arr = store.getters.selectedList.map(v => v.skuId)
          checkAllCart({ selected, ids: arr }).then(res => {
            // 调用获取购物车列表---刷新页面
            store.dispatch('findCartList')
            resolve()
          })
        } else {
          // 本地
          // 1. 获取有效的商品列表，遍历的去调用修改mutations即可
          store.getters.validList.forEach(item => {
            item.selected = selected
            store.commit('updateCart', item)
          })
          resolve()
        }
      })
    },
    // 更新修改购物车商品对象--发请求
    updateCart (store, goods) {
      return new Promise((resolve) => {
        if (store.rootState.user.profile.token) {
          // 1. 已登录 - 发送请求
          updateCart({ skuId: goods.skuId, selected: goods.selected, count: goods.count }).then(res => {
            // 调用获取购物车列表---刷新页面
            store.dispatch('findCartList')
            resolve()
          })
        } else {
          // 2. 未登录 - 直接修改本地
          store.commit('updateCart', goods)
          resolve('更新成功')
        }
      })
    },
    // 删除多个已经选择的商品
    delSelect (store) {
      return new Promise((resolve, reject) => {
        // 找到用户区块的token，看看有没有登录
        if (store.rootState.user.profile.token) {
          const arr = store.getters.selectedList.map(v => v.skuId)
          deleteCart(arr).then(res => {
            // 调用获取购物车列表---刷新页面
            store.dispatch('findCartList')
            resolve('删除商品成功-接口')
          })
        } else {
          store.getters.selectedList.forEach(v => {
            store.commit('deleteCart', v.skuId)
          })
          resolve('删除商品成功')
        }
      })
    },
    // 删除购物车商品--发送请求
    deleteCart (store, skuId) {
      // 返回一个Promise,后续在组件中方便操作
      return new Promise((resolve, reject) => {
        // 找到用户区块的token，看看有没有登录
        if (store.rootState.user.profile.token) {
          deleteCart([skuId]).then(res => {
            // 调用获取购物车列表---刷新页面
            store.dispatch('findCartList')
            resolve('删除商品成功-接口')
          })
        } else {
          store.commit('deleteCart', skuId)
          resolve('删除商品成功')
        }
      })
    },
    // 加入购物车--发送请求
    addCart (store, payload) {
      // 返回一个Promise,后续在组件中方便操作
      return new Promise((resolve) => {
        // 找到用户区块的token，看看有没有登录
        if (store.rootState.user.profile.token) {
          insertCart({ skuId: payload.skuId, count: payload.count }).then(res => {
            // 调用获取购物车列表---刷新页面
            store.dispatch('findCartList')
            resolve('加入购物车成功-接口')
          })
        } else {
          store.commit('addCart', payload)
          resolve('加入购物车成功')
        }
      })
    }
  },
  getters: {
    // 选中商品列表
    selectedList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 选中商品件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 选中商品总金额
    selectedAmount (state, getters) {
      return getters.selectedList.reduce((p, c) => p + (c.nowPrice * 100 * c.count), 0) / 100
    },
    // 是否全选
    isCheckAll (state, getters) {
      return getters.validList.length === getters.selectedList.length && getters.selectedList.length !== 0
    },
    // 无效商品列表
    invalidList (state) {
      return state.list.filter(item => !(item.stock > 0 && item.isEffective))
    },
    // 有效商品列表
    validList (state) {
      return state.list.filter(item => item.stock > 0 && item.isEffective)
    },
    // 有效商品件数
    validTotal (state, getters) {
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品总金额
    validAmount (state, getters) {
      return getters.validList.reduce((p, c) => p + c.nowPrice * 100 * c.count, 0) / 100
    }
  }
}
